var jwtUtil = require("../utils/permission/jwtutil"); // 导入token模块
const db = require("../db/mysql"); // 引入 数据库 配置
const bcrypt = require("bcryptjs"); // 引入 bcryptjs 加密模块
/**
 * 用户登录
 * @param { object } ctx
 * * username 账号
 * * password 密码
 * @param { function } next
 * @returns
 */
// 用户登录
const login = async (ctx, next) => {
  // 获取客户端IP地址
  try {
    const { username, password } = ctx.request.body;
    // 1. 查找用户
    const [data] = await db.query(
      "SELECT id, username, password, nick, type, email FROM account WHERE username = ?",
      [username]
    );
    const user = data ? data[0] : false;
    // 2. 用户不存在
    if (!user) {
      ctx.body = {
        code: 400,
        message: "用户名或密码错误",
      };
      return;
    }
    // 3. 校验密码
    const isPasswordCorrect = await bcrypt.compare(password, user.password);
    if (!isPasswordCorrect) {
      ctx.body = {
        code: 400,
        message: "用户名或密码错误",
      };
      return;
    }
    // 4. 生成JWT Token
    const payload = {
      id: user.id,
      username: user.username,
      nick: user.nick,
      type: user.type,
      email: user.email,
    };
    const token = jwtUtil.encrypt(payload);
    // 5. 返回结果
    ctx.body = {
      code: 200,
      message: "登录成功",
      data: {
        token, // 返回生成的token
        user: payload,// 返回用户信息
      },
    };
  } catch (err) {
    ctx.body = {
      code: 500,
      msg: "登录失败",
      data: err,
    };
  }
};

/**
 * 用户注册
 * @param {*} ctx
 * * username 账号
 * * password 密码
 * @param {*} next
 * @returns
 */
const register = async (ctx, next) => {
  try {
    const { username, password } = ctx.request.body;

    if (!username || !password) {
      ctx.status = 400;
      ctx.body = { code: 400, message: '用户名和密码不能为空' };
      return;
    }

    try {
      // 检查用户名是否已存在
      const [rows] = await db.query('SELECT * FROM account WHERE username = ?', [username]);
      if (rows.length > 0) {
        ctx.status = 400;
        ctx.body = { code: 400, message: '用户名已存在' };
        return;
      }

      // 加密密码
      const hashedPassword = bcrypt.hashSync(password, 10);
      // 插入新用户
      const [result] = await db.query(
        'INSERT INTO account (username, password, creationTime, lastLoginTime) VALUES (?, ?, NOW(), NOW())',
        [username, hashedPassword]
      );
      // 获取自增ID
      const userId = result.insertId;
      // 设置默认昵称
      await db.query(
        'UPDATE account SET nick = ? WHERE id = ?',
        [`用户${userId}`, userId]
      );

      ctx.status = 201;
      ctx.body = {
        code: 200,
        message: '注册成功',
        data: {
          userId,
          username,
          nick: `用户${userId}`
        }
      };
    } catch (error) {
      console.error(error);
      ctx.status = 500;
      ctx.body = { message: '服务器错误', code: 500 };
    }
  } catch (err) {
    ctx.body = {
      code: 500,
      message: "注册失败",
      data: err,
    };
  }
};

/**
 * 获取用户列表
 * @param { object } ctx
 * * page 页码
 * * pageSize 分页大小
 * @returns {Promise<void>}
 */
const userList = async (ctx) => {
  try {
    // 获取分页参数，默认页码为1，每页显示10条数据
    const page = parseInt(ctx.query.page) || 1; // 当前页，默认为第1页
    const pageSize = parseInt(ctx.query.pageSize) || 10; // 每页显示的条数，默认为10条
    const offset = (page - 1) * pageSize; // 计算偏移量
    // 执行查询，选择需要的字段（排除 password）
    const [results] = await db.query(
      "SELECT id, username, nick, type, headerUrl, creationTime, changeTime, email FROM account LIMIT ? OFFSET ?",
      [pageSize, offset]
    );
    // 如果结果为空，返回空数据提示
    if (results.length === 0) {
      ctx.body = JSON.stringify({
        code: 0,
        message: "No data available", // 无数据时的提示信息
        data: [],
      });
      return;
    }
    // 计算总记录数，以便进行分页信息返回
    const [totalResults] = await db.query(
      "SELECT COUNT(*) AS total FROM account"
    );
    // 返回分页后的数据和总记录数
    ctx.body = JSON.stringify({
      code: 1,
      data: {
        list: results,
        total: totalResults[0].total, // 总记录数
        totalPages: Math.ceil(totalResults[0].total / pageSize), // 总页数
      },
      message: "查询成功",
    });
  } catch (err) {
    // 捕获并处理错误
    ctx.status = 500;
    ctx.body = {
      code: 0,
      message: "Database query failed",
      error: err.message,
    };
  }
};
module.exports = {
  login,
  register,
  userList,
};
